% Calculator.Txl - simple numerical expression evaluator

% Part I.  Syntax specification
define program
	[expression]
end define

define expression
    	[term]
    |	[expression] [addop] [term]
end define

define term
    	[primary]
    |	[term] [mulop] [primary]
end define

define primary 
	[number]
    | 	( [expression] )
end define

define addop
	'+
    |	'-
end define

define mulop
	'*
    |  	'/
end define


% Part 2.  Transformation rules
rule main
    replace [expression]
	E [expression]
    construct NewE [expression]
	E [resolveAddition]
	  [resolveSubtraction]
	  [resolveMultiplication]
	  [resolveDivision]
	  [resolveBracketedExpressions]
    where not
	NewE [= E]
    by
	NewE
end rule

rule resolveAddition
    replace [expression]
	N1 [number] + N2 [number]
    by
	N1 [+ N2]
end rule

rule resolveSubtraction
    replace [expression]
	N1 [number] - N2 [number]
    by
	N1 [- N2]
end rule 

rule resolveMultiplication
    replace [term]
	N1 [number] * N2 [number]
    by
	N1 [* N2]
end rule 

rule resolveDivision
    replace [term]
	N1 [number] / N2 [number]
    by
	N1 [/ N2]
end rule

rule resolveBracketedExpressions
    replace [primary]
	( N [number] )
    by
	N
end rule

